package global

import (
	"strings"
	log "code.google.com/p/log4go"
	"fmt"
	"errors"
)

/**
	关键配置信息检查排错
 */
func CheckConfigErr() error{

	tasks := Config().Tasks
	for index := range tasks {
		task := tasks[index]
		if task.IsUse {
			/**
				taskName为空 抛出异常
			 */
			if task.TaskName=="" || task.TaskId==""{
				errStr := fmt.Sprintf(
					"taskName [%s] or taskId [%s] must not be null",
					task.TaskName,task.TaskId)
				log.Error(errStr)
				return errors.New(errStr)
			}
			dbSrc := [2]*DbSrc{task.Db1Src,task.Db2Src}
			for i := range dbSrc{
				/**
					db1-src和db2-src的id等其他消息不能为空
				 */
				 v := dbSrc[i]
				 if v.Ip ==""||v.Port==""||v.CharacterEncoding==""||v.Database==""||v.Table==""||v.MaxOpenConns==0||v.MaxIdleConns==0||v.Condition==""||v.Key==""{
					 errStr := fmt.Sprintf(
						 "taskId [%s] taskName [%s] dbSrc has field value is empty ! your config " +
						 	"Ip:[%s] Port:[%s] CharacterEncoding:[%s] Database:[%s] Table: [%s] MaxOpenConns:[%v] MaxIdleConns:[%v] Conditon:[%s] Key:[%s]",
						 task.TaskId,task.TaskName,
						v.Ip,v.Port,v.CharacterEncoding,v.Database,v.Table,v.MaxOpenConns,v.MaxIdleConns,v.Condition,v.Key)
					 log.Error(errStr)
					 return errors.New(errStr)
				 }
				/**
					db1-src和 db2-src的前置sql语句只能是查询语句(select xx)
				 */
				 if dbSrc[i].BeforeSql!=""&& !strings.HasPrefix(dbSrc[i].BeforeSql,"select"){
					errStr := fmt.Sprintf(
						"taskId [%s] taskName [%s] before-sqls must startWith select ,your sqls : [%s]",
						task.TaskId,task.TaskName,dbSrc[i].BeforeSql)
					log.Error(errStr)
					return errors.New(errStr)
				}
			}
			/**
				dbDest相关的配置的检查,有些不能为空
			 */
			t :=task.DBDest
			if t.Ip ==""||t.Port==""||t.CharacterEncoding==""||t.Database==""||t.Table==""||t.MaxOpenConns==0||t.MaxIdleConns==0||len(t.Cloumn)==0||len(t.Db1Mapping)==0||len(t.Db2Mapping)==0{
				errStr := fmt.Sprintf(
					"taskId [%s] taskName [%s] dbDest has field value is empty ! your config" +
						"Ip:[%s] Port:[%s] CharacterEncoding:[%s] Database:[%s] Table: [%s] MaxOpenConns:[%v] MaxIdleConns:[%v] Cloumn:[%s] Db1Mapping [%s] Db2Mapping [%s] ",
					task.TaskId,task.TaskName,
					t.Ip,t.Port,t.CharacterEncoding,t.Database,t.Table,t.MaxOpenConns,t.MaxIdleConns,t.Cloumn,t.Db1Mapping,t.Db2Mapping)
				log.Error(errStr)
				return errors.New(errStr)
			}
			/**
				目标库存储勾兑失败的数据，前置sql不能包含危险操作
			 */
			if t.BeforeSql!="" && (strings.Contains(t.BeforeSql,"truncate") || strings.Contains(t.BeforeSql,"database")){
				errStr := fmt.Sprintf(
					"taskId [%s] taskName [%s] dbDest BeforeSql can't have [truncate] or [database] your dbDest BeforeSql: [%s]",
						task.TaskId,task.TaskName,t.BeforeSql)
					log.Error(errStr)
				return errors.New(errStr)
			}
			/**
				目标库存储勾兑失败的数据，前置sql不能不包含 where
			*/
			if t.BeforeSql!="" && !strings.Contains(t.BeforeSql,"where"){
				errStr := fmt.Sprintf(
					"taskId [%s] taskName [%s] dbDest BeforeSql must have 'where' condition your dbDest BeforeSql: [%s]",
					task.TaskId,task.TaskName,t.BeforeSql)
				log.Error(errStr)
				return errors.New(errStr)
			}

			/**
				joinKey 配置不能为空
			 */
			if len(task.JoinKey)==0{
				errStr := fmt.Sprintf(
					"taskId [%s] taskName [%s] join-key must not be null ",
					task.TaskId,task.TaskName)
				log.Error(errStr)
				return errors.New(errStr)
			}
		}
	}
	return nil

}
